#include"list.h"

#include<algorithm>
// #include<list>
namespace Wang{

// void test01()
// {
//     list<int> l1;
//     for(int i = 1; i <= 5; i++)
//         l1.push_back(i);
//     // l1.print();
//     auto i = l1.begin();
//     while(i != l1.end())
//     {
//         cout << *i << ' ';
//         *i = 999;
//         ++i;
//     }
//     cout << endl;

//     for(auto& e : l1)   cout << e << ' ';
//     cout << endl;

//     // list<int> l2 = l1;
// }

// void test02()
// {
//     list<pair<int,int>> ls;
//     for(int i = 0; i < 10; i++)
//         ls.push_back({i, i});
//     // list<pair<int,int>>::iterator& it = ls.begin(); // err

//     // err
//     // const list<pair<int,int>>::iterator& it = ls.begin();
//     // ++it;

//     // ++ls.begin()却能正常运行，ls.begin()返回的不是具有const属性吗？这里编译器会特殊处理
//     list<pair<int,int>>::iterator it = ++ls.begin();
//     while(it != ls.end())
//     {
//         // it.operator->()->first
//         cout << it->first << ' ' << it->second << endl;
//         ++it;
//     }
// }

void test03()
{
    list<int> ls1;
    for(int i = 0; i < 10; i++) ls1.push_back(i);

    auto it = find(ls1.begin(), ls1.end(), 3);
    cout << *it << endl;

    // const list<int> ls2 = ls1;
    // for(auto& e : ls2)
    // {
    //     cout << e << ' ';
    //     // e = 10;
    // }
}

void test04()
{
    list<int> l1;
    for(int i  = 0; i < 10; i++)
        l1.insert(--l1.end(), i);
    for(auto e : l1) cout << e << ' ';
}

void test05()
{
    const list<int> l1 = { 1,2,3,4,5 };
    for(auto& e : l1)   cout << e << ' ';
    cout << endl;

    // list<const string> l2 = { "111", "222", "333" };
    // for(auto& e : l2)   {
    //     cout << e << ' ';
    //     // e = "xxxx";
    // }
    // cout << endl;

    list<int> l3{ 1,1,1,1 };
    l3 = l1;
    // for(auto& e : l3)   cout << e << ' ';
    // cout << endl;

    // // err
    // list<int>::const_iterator it = l3.begin();
    // while(it != l3.end())
    // {
    //     cout << *it << ' ';
    //     ++it;
    // }
}
} // namespace Wang

// class A
// {
// public:
//     int* _p;
//     A(int* p = nullptr)
//         :_p(p)
//     {}

//     void Print()
//     {
//         cout << (void*)_p << endl;
//     }

//     // void modify() const
//     // {
//     //     _p = nullptr;   // 也不可修改
//     // }
// };


int main()
{
    Wang::test03();
    
    // int a = 10;
    // A p1 = &a;
    // const A p2(&a);
    // // p2.modify();

    return 0;
}

/*
const修饰自定义类型的属性：
1. 所有非静态数据成员都不能被修改​（除非标记为 mutable）
2. 只能调用const成员函数（构造和析构除外）

*/